
#ifndef _LOG_WRAPPER_H_
#define _LOG_WRAPPER_H_

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <cstdarg>
#include <cstdio>
#include <string>
#include <securec.h>
#include "log.h"

#undef LOG_TAG
#undef LOG_DOMAIN
#define LOG_TAG "WRAP"
#define LOG_DOMAIN 0xD001406

#define DEBUG LogLevel::LOG_DEBUG
#define INFO LogLevel::LOG_INFO
#define VERBOSE LogLevel::LOG_INFO
#define WARN LogLevel::LOG_WARN
#define WARNING LogLevel::LOG_WARN
#define ERROR LogLevel::LOG_ERROR
#define FATAL LogLevel::LOG_FATAL

#define LOG(logLevel)                               \
    LogWrapper::g_LogWrapper.setLogLevel(logLevel); \
    LogWrapper::g_LogWrapper

class LogWrapper {
public:
    static LogWrapper g_LogWrapper;
    void setLogLevel(LogLevel logLevel)
    {
        logLevel_ = logLevel;
    }

    //str
    int logPrint(const char* log)
    {
        return HiLogPrint(LogType::LOG_CORE, logLevel_, LOG_DOMAIN, LOG_TAG, "%{public}s", log);
    }

    friend LogWrapper& operator<<(LogWrapper& wrapper, const char* log)
    {
        wrapper.logPrint(log);
        return wrapper;
    }

    //size_t
    int logPrint(size_t size)
    {
        return HiLogPrint(LogType::LOG_CORE, logLevel_, LOG_DOMAIN, LOG_TAG, "%{public}zu", size);
    }

    friend LogWrapper& operator<<(LogWrapper& wrapper, size_t size)
    {
        wrapper.logPrint(size);
        return wrapper;
    }

    //string
    int logPrint(const std::string log)
    {
        return HiLogPrint(LogType::LOG_CORE, logLevel_, LOG_DOMAIN, LOG_TAG, "%{public}s", log.c_str());
    }

    friend LogWrapper& operator<<(LogWrapper& wrapper, const std::string log)
    {
        wrapper.logPrint(log);
        return wrapper;
    }

private:
    LogLevel logLevel_ { LOG_DEBUG };
};

// #if defined(__cplusplus)
// extern "C" {
// #endif

// #define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1) : __FILE__)
// enum Level { 
//     WRAP_LOG_LEVEL_INFO = 0, 
//     WRAP_LOG_LEVEL_DEBUG, 
//     WRAP_LOG_LEVEL_WARN, 
//     WRAP_LOG_LEVEL_ERROR, 
//     WRAP_LOG_LEVEL_FATAL 
// };

// const int MAX_LOG_LENGTH = 2048;

// inline static void WrapperLog(int level, const char* format, ...)
// {
//     char logStr[MAX_LOG_LENGTH] = {0};
//     va_list args;
//     va_start(args, format);
//     int ret = vsprintf_s(logStr, MAX_LOG_LENGTH, format, args);
//     if (ret == -1) { // vsprintf_s failed
//         HILOG_ERROR(LOG_CORE, "print log error in vsprintf_s");
//         va_end(args);
//         return;
//     }
//     va_end(args);

//     switch(level){
//         case WRAP_LOG_LEVEL_INFO:
//             HILOG_INFO(LOG_CORE, "%{public}s \n", logStr);
//             break;
//         case WRAP_LOG_LEVEL_DEBUG:
//             HILOG_DEBUG(LOG_CORE, "%{public}s \n", logStr);
//             break;
//         case WRAP_LOG_LEVEL_WARN:
//             HILOG_WARN(LOG_CORE, "%{public}s \n", logStr);
//             break;
//         case WRAP_LOG_LEVEL_ERROR:
//             HILOG_ERROR(LOG_CORE, "%{public}s \n", logStr);
//             break;
//         case WRAP_LOG_LEVEL_FATAL:
//             HILOG_ERROR(LOG_CORE, "%{public}s \n", logStr);
//             break;
//     }

//     return;
// }

// #ifndef ALOG
// #define ALOG(level,log_tag,format, ...) \
//     do { \
//         WrapperLog(level, "[%s@%s:%d] " format , __FUNCTION__, __FILENAME__, __LINE__, \
//             ##__VA_ARGS__); \
//     } while (0)
// #endif

// #ifndef ALOGE
// #define ALOGE(format, ...) \
//     do { \
//         WrapperLog(WRAP_LOG_LEVEL_ERROR, "[%s@%s:%d] " format , __FUNCTION__, __FILENAME__, __LINE__, \
//             ##__VA_ARGS__); \
//     } while (0)
// #endif

// #ifndef ALOGI
// #define ALOGI(format, ...) \
//     do { \
//         WrapperLog(WRAP_LOG_LEVEL_INFO, "[%s@%s:%d] " format , __FUNCTION__, __FILENAME__, __LINE__, \
//             ##__VA_ARGS__); \
//     } while (0)
// #endif

// #ifndef ALOGV
// #define ALOGV(format, ...) \
//     do { \
//         WrapperLog(WRAP_LOG_LEVEL_FATAL, "[%s@%s:%d] " format , __FUNCTION__, __FILENAME__, __LINE__, \
//             ##__VA_ARGS__); \
//     } while (0)
// #endif

// #ifndef ALOGW
// #define ALOGW(format, ...) \
//     do { \
//         WrapperLog(WRAP_LOG_LEVEL_WARN, "[%s@%s:%d] " format , __FUNCTION__, __FILENAME__, __LINE__, \
//             ##__VA_ARGS__); \
//     } while (0)
// #endif

// #ifndef ALOGD
// #define ALOGD(format, ...) \
//     do { \
//         WrapperLog(WRAP_LOG_LEVEL_DEBUG, "[%s@%s:%d] " format , __FUNCTION__, __FILENAME__, __LINE__, \
//             ##__VA_ARGS__); \
//     } while (0)
// #endif

// #ifdef __cplusplus
// }
// #endif

#endif /*end of _LOG_WRAPPER_H_*/